package com.hlf.modules.base.service.impl;


import com.hlf.common.page.Page;
import com.hlf.common.page.PageReturn;
import com.hlf.common.utils.SpringContextUtils;
import com.hlf.modules.base.entity.BaseModel;
import com.hlf.modules.base.entity.Common;
import com.hlf.modules.base.mapper.BaseMapperr;
import com.hlf.modules.base.service.BaseService;
import org.apache.commons.lang.StringUtils;

import java.lang.reflect.ParameterizedType;

/**
 * 基础服务层实现类,E=entity,M=mapper
 * 
 * @author shuliangxing
 *
 * @date 2017年3月23日 下午4:29:10
 */
public class BaseServiceImpl<E extends BaseModel, M extends BaseMapperr<E>> extends Common<E> implements BaseService<E> {

    protected M m;

    @Override
    public void deleteByIdHard(String id) {
        if (StringUtils.isNotBlank(id)) {
            init().deleteByPrimaryKey(id);
        }
    }

    @Override
    public void deleteByIdSoft(String id) {
        if (StringUtils.isNotBlank(id)) {
            init().deleteByPrimaryKeySoft(id);
        }
    }

    @Override
    public void insertAll(E record) {
        init().insert(super.checkOrAddId(record));
    }

    @Override
    public void insertSelective(E record) {
        init().insertSelective(super.checkOrAddId(record));
    }

    @Override
    public E selectById(String id) {
        return init().selectByPrimaryKey(id);
    }

    @Override
    public void updateByIdAll(E record) {
        init().updateByPrimaryKey(super.checkIdNull(record));
    }

    @Override
    public void updateByIdSelective(E record) {
        init().updateByPrimaryKeySelective(super.checkIdNull(record));
    }

    @Override
    public PageReturn<E> selectForPage(E record, Page page) {
        return new PageReturn<E>(init().selectForPage(record, page), init().selectForPageCount(record), page, record);
    }

    @Override
    public PageReturn<E> selectForPageNoTotalPage(E record, Page page) {
        return new PageReturn<E>(init().selectForPage(record, page), page, record);
    }

    /**
     * 根据泛型实例化子类对应的mapper
     *
     * @author shuliangxing
     * @date 2017年3月28日 下午4:53:09
     */
    @SuppressWarnings("unchecked")
    private M init() {
        if (m == null) {
            // 实例化子类对应的mapper
            Class<M> entityClass = (Class<M>) ((ParameterizedType) getClass().getGenericSuperclass())
                    .getActualTypeArguments()[1];
            m = SpringContextUtils.getBeanByClass(entityClass);
        }
        return m;
    }

}
